{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# TensorFlow从入门到精通\n",
    "# 01 简单线性模型（Simple Linear Model）\n",
    "\n",
    "Author: Amusi\n",
    "\n",
    "Date: 2018-06-30\n",
    "\n",
    "github: [TensorFlow从入门到精通](https://github.com/amusi/TensorFlow-From-Zero-To-One)\n",
    "\n",
    "Reference: [Magnus Erik Hvass Pedersen](http://www.hvass-labs.org/)\n",
    "/ [GitHub](https://github.com/Hvass-Labs/TensorFlow-Tutorials) / [Videos on YouTube](https://www.youtube.com/playlist?list=PL9Hr9sNUjfsmEu1ZniY0XpHSzl5uihcXZ)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 介绍\n",
    "\n",
    "本教程介绍了使用TensorFlow实现简单线性模型的workflow。在加载MNISIT（手写字符图像数据集）后，我们使用TensorFlow定义并优化一个简单的数学模型。然后绘制并讨论结果。\n",
    "\n",
    "This tutorial demonstrates the basic workflow of using TensorFlow with a simple linear model. After loading the so-called MNIST data-set with images of hand-written digits, we define and optimize a simple mathematical model in TensorFlow. The results are then plotted and discussed.\n",
    "\n",
    "你应该熟悉基本的线性代数，Python，Jupyter Notebook编辑器。如果你对机器学习和分类有基本的了解，这也会帮助到你。\n",
    "\n",
    "You should be familiar with basic linear algebra, Python and the Jupyter Notebook editor. It also helps if you have a basic understanding of Machine Learning and classification."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 导入必要库（Imports）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Program Files\\Anaconda3_4.2\\envs\\tf14\\lib\\site-packages\\h5py\\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n",
      "  from ._conv import register_converters as _register_converters\n"
     ]
    }
   ],
   "source": [
    "%matplotlib inline  \n",
    "import matplotlib.pyplot as plt\n",
    "import tensorflow as tf\n",
    "import numpy as np\n",
    "from sklearn.metrics import confusion_matrix"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This was developed using Python 3.5 (Anaconda) or later and TensorFlow version:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'1.4.0'"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tf.__version__"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "大家可能会对上述代码中的第一句 %matplotlib inline有所好奇，该语句怎么是这样的？其作用是什么？\n",
    "\n",
    "这里Amusi引出两种介绍，第一种是根本性解释，第二种是适用于此代码的解释。\n",
    "\n",
    "**第一种解释[1]：**\n",
    "\n",
    "%matplotlib inline 是一个魔法函数（Magic Functions）。官方给出的定义是：IPython有一组预先定义好的所谓的魔法函数（Magic Functions），你可以通过命令行的语法形式来访问它们。可见“%matplotlib inline”就是模仿命令行来访问magic函数的在IPython中独有的形式。\n",
    "\n",
    "magic函数分两种：一种是面向行的，另一种是面向单元型的。\n",
    "\n",
    "行magic函数是用前缀“%”标注的，很像我们在系统中使用命令行时的形式，例如在Mac中就是你的用户名后面跟着“$”。“%”后面就是magic函数的参数了，但是它的参数是没有被写在括号或者引号中来传值的。\n",
    "\n",
    "单元型magic函数是由两个“%%”做前缀的，它的参数不仅是当前“%%”行后面的内容，也包括了在当前行以下的行。\n",
    "\n",
    "注意：既然是IPython的内置magic函数，那么在Pycharm中是不会支持的。\n",
    "\n",
    "总结：%matplotlib inline 可以在Ipython编译器里直接使用，功能是可以**内嵌绘图，并且可以省略掉plt.show()这一步。**\n",
    "\n",
    "\n",
    "**第二种解释[2]：**\n",
    "\n",
    "%matplotlib inline比较奇怪，而且无论你是用哪个python的IDE如spyder或者pycharm,这个地方都会报错，显示是invalid syntax（无效语法）。那为什么代码里面还是会有这一句呢？原来是这样的。\n",
    "%matplotlib作用\n",
    "\n",
    "是在使用jupyter notebook 或者 jupyter qtconsole的时候，才会经常用到%matplotlib，也就是说那一份代码可能就是别人使用jupyter notebook 或者 jupyter qtconsole进行编辑的。关于jupyter notebook是什么，可以参考这个链接：[Jupyter Notebook介绍、安装及使用教程][1]\n",
    "而%matplotlib具体作用是当你调用matplotlib.pyplot的绘图函数plot()进行绘图的时候，或者生成一个figure画布的时候，可以直接在你的python console里面生成图像。\n",
    "而我们在spyder或者pycharm实际运行代码的时候，可以直接注释掉这一句，也是可以运行成功的。如下示例：\n",
    "\n",
    "\n",
    "**Amusi 总结：**\n",
    "\n",
    "为了在Jupyter Notebook中使用matplotlib.pyplot的plot函数，即实现内嵌绘图，而需要加上%matplotlib inline\n",
    "\n",
    "参考：\n",
    "[1]：https://blog.csdn.net/liangzuojiayi/article/details/78183783?locationNum=8&fps=1\n",
    "[2]：https://www.jianshu.com/p/2dda5bb8ce7d"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 加载数据（Load Data）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "如果在给定路径下，没有MNIST数据集，那么程序会自动下载该数据集（大约11MB）\n",
    "\n",
    "The MNIST data-set is about 11 MB and will be downloaded automatically if it is not located in the given path."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting data/MNIST/train-images-idx3-ubyte.gz\n",
      "Extracting data/MNIST/train-labels-idx1-ubyte.gz\n",
      "Extracting data/MNIST/t10k-images-idx3-ubyte.gz\n",
      "Extracting data/MNIST/t10k-labels-idx1-ubyte.gz\n"
     ]
    }
   ],
   "source": [
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "data = input_data.read_data_sets(\"data/MNIST/\", one_hot=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现在 MNIST数据集已经加载好，该数据集包含70,000幅图像和标签（即图像的类别）。数据集被分成3个互不交叉的子集（训练集、测试集和验证集），在本教程中，我们将只使用训练集和测试集。\n",
    "\n",
    "其中：\n",
    "\n",
    "- 训练集（Training set）：55000幅图像\n",
    "\n",
    "- 测试集（Test set）：10000幅图像\n",
    "\n",
    "- 验证集（Validation set）：5000幅图像\n",
    "\n",
    "The MNIST data-set has now been loaded and consists of 70.000 images and associated labels (i.e. classifications of the images). The data-set is split into 3 mutually exclusive sub-sets. We will only use the training and test-sets in this tutorial."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Size of:\n",
      "- Training-set:\t\t55000\n",
      "- Test-set:\t\t10000\n",
      "- Validation-set:\t5000\n"
     ]
    }
   ],
   "source": [
    "print(\"Size of:\")\n",
    "print(\"- Training-set:\\t\\t{}\".format(len(data.train.labels)))\n",
    "print(\"- Test-set:\\t\\t{}\".format(len(data.test.labels)))\n",
    "print(\"- Validation-set:\\t{}\".format(len(data.validation.labels)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 独热编码（One-Hot Encoding）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "MNIST数据集由One-hot encoding方式加载。这意味着标签由单个数字（类别）转换成一个向量，其长度等价于可能类别数量（如有10类，则长度为10）。向量的所有元素除了第i个元素为 1之外（因为该标签的类别是i），其它元素都为0。\n",
    "\n",
    "The data-set has been loaded as so-called One-Hot encoding. This means the labels have been converted from a single number to a vector whose length equals the number of possible classes. All elements of the vector are zero except for the $i$'th element which is one and means the class is $i$. For example, the One-Hot encoded labels for the first 5 images in the test-set are:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],\n",
       "       [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.]])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 输出测试集前5个标签的向量数据\n",
    "data.test.labels[0:5, :]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们还需要将类（classes）作为单个数字进行各种比较和性能测量，因此我们通过获取最高元素（其值为1）的索引来将One-Hot编码向量转换为单个数字。请注意，'class'这个词是Python中使用的关键字，因此我们需要使用名称'cls'。\n",
    "\n",
    "We also need the classes as single numbers for various comparisons and performance measures, so we convert the One-Hot encoded vectors to a single number by taking the index of the highest element. Note that the word 'class' is a keyword used in Python so we need to use the name 'cls' instead."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# argmax(): Returns the indices of the maximum values along an axis\n",
    "data.test.cls = np.array([label.argmax() for label in data.test.labels])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上面代码，我们使用了numpy的[argmax()函数](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.argmax.html)。该函数的作用是：Returns the indices of the maximum values along an axis。因为类别向量中只有1是最大值，而1所在的索引位置就是我们所要的值。argmax()正好完美适用！\n",
    "\n",
    "现在我们可以知道测试集中前5幅图像的类别。你可以将其与上述One-Hot编码向量进行比较。例如，第一幅图像的类是7，其对应于One-Hot编码向量中索引为7的元素，该元素值为1。\n",
    "\n",
    "We can now see the class for the first five images in the test-set. Compare these to the One-Hot encoded vectors above. For example, the class for the first image is 7, which corresponds to a One-Hot encoded vector where all elements are zero except for the element with index 7."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([7, 2, 1, 0, 4], dtype=int64)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.test.cls[0:5]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数据维度（Data dimensions）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "数据维度会在下面的代码中被使用。在计算机编程中，最好使用使用变量（variables）和常量（constants），而不是每次使用该编号时候都必须对特定数字进行硬编码（hard-code）。这意味着数字只需要在一个地方被修改。理想情况下，这些数据可以从已经读取的数据中推断（inferred）出来，但在这里我们只是写出数字。\n",
    "\n",
    "The data dimensions are used in several places in the source-code below. In computer programming it is generally best to use variables and constants rather than having to hard-code specific numbers every time that number is used. This means the numbers only have to be changed in one single place. Ideally these would be inferred from the data that has been read, but here we just write the numbers."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# MNIST图像数据的每个维度是28个像素（即28x28）\n",
    "img_size = 28\n",
    "\n",
    "# 图像存储在一维数组中\n",
    "img_size_flat = img_size * img_size\n",
    "\n",
    "# 将图像的高度和宽度变成不可变的元组（tuple），用于 reshape arrays。\n",
    "img_shape = (img_size, img_size)\n",
    "\n",
    "# 类别的数量：10，即每一类用一个数值来表示\n",
    "num_classes = 10"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 绘图的帮助函数（Helper-function for plotting images）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "函数使用3x3网格绘制9幅图像，并在每幅图像下面显示真实正确的类别和预测的类别。\n",
    "\n",
    "Function used to plot 9 images in a 3x3 grid, and writing the true and predicted classes below each image."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def plot_images(images, cls_true, cls_pred=None):\n",
    "    # 判断输入参数是否符合要求\n",
    "    assert len(images) == len(cls_true) == 9\n",
    "    \n",
    "    # 创建3x3的图和subplots的集合\n",
    "    fig, axes = plt.subplots(3, 3)\n",
    "    fig.subplots_adjust(hspace=0.3, wspace=0.3)\n",
    "\n",
    "    for i, ax in enumerate(axes.flat):\n",
    "        # 绘图\n",
    "        ax.imshow(images[i].reshape(img_shape), cmap='binary')\n",
    "        \n",
    "        # 显示正确和预测的类别\n",
    "        if cls_pred is None:\n",
    "            xlabel = \"True: {0}\".format(cls_true[i])  # \"{N}\".format(n0,n1,...,nN)一定要掌握这种写法\n",
    "        else:\n",
    "            xlabel = \"True: {0}, Pred: {1}\".format(cls_true[i], cls_pred[i])\n",
    "\n",
    "        ax.set_xlabel(xlabel)\n",
    "        \n",
    "        # 删除plot的刻度（ticks）\n",
    "        ax.set_xticks([])\n",
    "        ax.set_yticks([])\n",
    "        \n",
    "    # 在单个Notebook 单元格中正确的显示plot图。\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 绘制一些图像检查数据是否正确"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nEMZccjkjBQkAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1ea2b2ae940>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 从测试集中获得前9幅图像数据\n",
    "images = data.test.images[0:9]\n",
    "\n",
    "# 获得相应的正确类别\n",
    "cls_true = data.test.cls[0:9]\n",
    "\n",
    "# 使用上述函数绘制图像和标签（非预测）\n",
    "plot_images(images=images, cls_true=cls_true)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## TensorFlow 图（Graph）\n",
    "\n",
    "TensorFlow 的目的是实现一个计算图（computational graph），与直接在Python中执行的计算相比，其可以更有效的执行。TensorFlow可以比Numpy更有效，因为TensorFlow知道必须执行的整个计算图，而Numpy一次只知道单个数学运算的计算。\n",
    "\n",
    "TensorFlow 还可以自动计算优化图中变量所需的梯度，以使得模型更好地运行。这是因为图（Graph）是简单数学表达式的组合，因此可以使用微分（derivatives）的链式法则（chain-rule）来计算整个图的梯度。\n",
    "\n",
    "TensorFlow 还可以利用多核CPU和GPU的，而且Google甚至为TensorFlow研发了专用芯片，称为TPU（Tensor Processing Units），甚至比GPU更快。\n",
    "\n",
    "TensorFlow图由以下部分组成，将在下面详述：\n",
    "\n",
    "- 占位符（Placeholder）变量用于改变图的输入\n",
    "\n",
    "- 模型变量将进行优化，以使模型表现更好\n",
    "\n",
    "- 模型本质上是数学函数，它很具占位符变量和模型变量的输入计算一些输出\n",
    "\n",
    "- 一种指导变量优化的代价度量（cost measure）\n",
    "\n",
    "- 一种更新模型变量的优化方法\n",
    "\n",
    "此外，TensorFlow图还可以包含各种调试语句，例如：可以由TensorBoard可视化的日志数据（本教程没有介绍）\n",
    "\n",
    "The entire purpose of TensorFlow is to have a so-called computational graph that can be executed much more efficiently than if the same calculations were to be performed directly in Python. TensorFlow can be more efficient than NumPy because TensorFlow knows the entire computation graph that must be executed, while NumPy only knows the computation of a single mathematical operation at a time.\n",
    "\n",
    "TensorFlow can also automatically calculate the gradients that are needed to optimize the variables of the graph so as to make the model perform better. This is because the graph is a combination of simple mathematical expressions so the gradient of the entire graph can be calculated using the chain-rule for derivatives.\n",
    "\n",
    "TensorFlow can also take advantage of multi-core CPUs as well as GPUs - and Google has even built special chips just for TensorFlow which are called TPUs (Tensor Processing Units) and are even faster than GPUs.\n",
    "\n",
    "A TensorFlow graph consists of the following parts which will be detailed below:\n",
    "\n",
    "* Placeholder variables used to change the input to the graph.\n",
    "* Model variables that are going to be optimized so as to make the model perform better.\n",
    "* The model which is essentially just a mathematical function that calculates some output given the input in the placeholder variables and the model variables.\n",
    "* A cost measure that can be used to guide the optimization of the variables.\n",
    "* An optimization method which updates the variables of the model.\n",
    "\n",
    "In addition, the TensorFlow graph may also contain various debugging statements e.g. for logging data to be displayed using TensorBoard, which is not covered in this tutorial."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 占位符变量（Placeholder variables）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "占位符变量（Placeholder variables）作为图的输入，我们可以在每次执行图的时候进行更改。我们称之为 喂（feeding）占位符变量，并在下面进一步说明。\n",
    "\n",
    "Placeholder variables serve as the input to the graph that we may change each time we execute the graph. We call this feeding the placeholder variables and it is demonstrated further below.\n",
    "\n",
    "首先，我们定义输入图像的**占位符变量‘x’**。这允许我们改变输入到TensorFlow图的图像。这是一个所谓的张量（tensor），这意味着它是一个多维向量或矩阵。**该占位符的数据类型设置成‘float32’，形状设置成‘[None, img_size_flat]’，其中‘None’表示张量可以存储（hold）任意数量的图像，每个图像是长度为‘img_size_flat’的向量。**\n",
    "\n",
    "First we define the placeholder variable for the input images. This allows us to change the images that are input to the TensorFlow graph. This is a so-called tensor, which just means that it is a multi-dimensional vector or matrix. The data-type is set to `float32` and the shape is set to `[None, img_size_flat]`, where `None` means that the tensor may hold an arbitrary number of images with each image being a vector of length `img_size_flat`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x = tf.placeholder(tf.float32, [None, img_size_flat])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来，我们定义占位符变量**‘y_true’**，其是存放与占位符‘x’中输入图像相关联的真实标签。**该占位符变量的数据类型设置成‘float32’，形状是‘[None, num_classes]’，这意味着它可以包含任意数量的标签，每个标签是长度为‘num_classes’的向量，在这种情况下为10。**\n",
    "\n",
    "Next we have the placeholder variable for the true labels associated with the images that were input in the placeholder variable `x`. The shape of this placeholder variable is `[None, num_classes]` which means it may hold an arbitrary number of labels and each label is a vector of length `num_classes` which is 10 in this case."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_true = tf.placeholder(tf.float32, [None, num_classes])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "最后，我们定义**占位符变量‘y_true_cls’**，其实存放与占位符‘x’中输入图像相关的类别。**该占位符的数据类型设置成‘int64’，形状设置为‘[None]’，这意味着该占位符变量是任意长度的一维向量。**\n",
    "\n",
    "Finally we have the placeholder variable for the true class of each image in the placeholder variable `x`. These are integers and the dimensionality of this placeholder variable is set to `[None]` which means the placeholder variable is a one-dimensional vector of arbitrary length."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_true_cls = tf.placeholder(tf.int64, [None])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 待优化的变量（Variables to be optimized）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "除了上面定义用作将输入数据输入到模型中的占位符变量之外，还有一些模型变量必须由TensorFlow进行更改，以使模型在训练数据上表现更好。\n",
    "\n",
    "Apart from the placeholder variables that were defined above and which serve as feeding input data into the model, there are also some model variables that must be changed by TensorFlow so as to make the model perform better on the training data.\n",
    "\n",
    "必须优化的第一个变量称为**“权重（weights）”**，在这里定义为TensorFlow变量，必须用零初始化，形状为[img_size_flat，num_classes]，因此它是具有`img_size_flat`行和`num_classes`列的二维张量（或矩阵） 。\n",
    "\n",
    "The first variable that must be optimized is called `weights` and is defined here as a TensorFlow variable that must be initialized with zeros and whose shape is `[img_size_flat, num_classes]`, so it is a 2-dimensional tensor (or matrix) with `img_size_flat` rows and `num_classes` columns."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# tf.zeros: 返回全是由0元素组成的值\n",
    "weights = tf.Variable(tf.zeros([img_size_flat, num_classes]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第二个必须要优化的变量称为**“偏置（biases)”**，其实长度为‘num_classes’的一维度张量（或向量）。这里也初始化为零。\n",
    "\n",
    "The second variable that must be optimized is called `biases` and is defined as a 1-dimensional tensor (or vector) of length `num_classes`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "biases = tf.Variable(tf.zeros([num_classes]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 模型（Model）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "简单的数学模型是将占位符变量‘x’乘以权重‘weights’，并加上偏置‘biases’\n",
    "\n",
    "This simple mathematical model multiplies the images in the placeholder variable `x` with the `weights` and then adds the `biases`.\n",
    "\n",
    "根据矩阵性质，输出结果是形状为‘[num_images, num_classes]’的矩阵。因为‘x’的形状为‘[num_images, img_size_flat]’，‘weights’的形状为‘[img_size_flat, num_classes]’，所以这两个矩阵相乘的结果是形状为‘[num_images, num_classes]’的矩阵。然后将‘biases’向量加到矩阵的每一行上（利用广播的特性）。\n",
    "\n",
    "The result is a matrix of shape `[num_images, num_classes]` because `x` has shape `[num_images, img_size_flat]` and `weights` has shape `[img_size_flat, num_classes]`, so the multiplication of those two matrices is a matrix with shape `[num_images, num_classes]` and then the `biases` vector is added to each row of that matrix.\n",
    "\n",
    "注意：名称‘logits’是典型的TensorFlow术语（terminogy），但你也可以叫做其它变量。\n",
    "\n",
    "Note that the name `logits` is typical TensorFlow terminology, but other people may call the variable something else."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "logits = tf.matmul(x, weights) + biases"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现在`logits`是一个带有`num_images`行和`num_classes`列的矩阵，其中第 i 行和第 j 列的元素是对第 i 幅输入图像估计为第 j 类的可能性（概率值）。\n",
    "\n",
    "Now `logits` is a matrix with `num_images` rows and `num_classes` columns, where the element of the $i$'th row and $j$'th column is an estimate of how likely the $i$'th input image is to be of the $j$'th class.\n",
    "\n",
    "然而，这些估计是大概的（rough）值且难以解释，因为这些数字可能非常小或很大，所以我们想对它们进行归一化处理，以使`logits`矩阵的每一行总和为1（因为概率值和为1)，并且每个元素被限制在[0,1]。这是使用所谓的[softmax函数](https://zh.wikipedia.org/wiki/Softmax函数)（又称归一化指数函数）计算的，结果存储在`y_pred`中。\n",
    "\n",
    "However, these estimates are a bit rough and difficult to interpret because the numbers may be very small or large, so we want to normalize them so that each row of the `logits` matrix sums to one, and each element is limited between zero and one. This is calculated using the so-called softmax function and the result is stored in `y_pred`.\n",
    "\n",
    "注：附上Softmax相关资源\n",
    "\n",
    "[1] [Softmax function wiki](https://en.wikipedia.org/wiki/Softmax_function)\n",
    "\n",
    "[2] [Softmax 函数的特点和作用是什么？](https://www.zhihu.com/question/23765351)\n",
    "\n",
    "[3] [Softmax回归](http://ufldl.stanford.edu/wiki/index.php/Softmax回归)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_pred = tf.nn.softmax(logits)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以通过获取 `y_pred`矩阵中每行中最大元素的索引计算预测的类别 `y_pred_cls`。\n",
    "\n",
    "The predicted class can be calculated from the `y_pred` matrix by taking the index of the largest element in each row."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_pred_cls = tf.argmax(y_pred, axis=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 待优化的代价函数（Cost-function to be optimized）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "为了使模型更好地分类输入图像，我们必须以某种方式改变“权重”（weights）和“偏差”（biases）的变量。要做到这一点，首先我们需要通过将模型的预测输出“y_pred”与期望输出“y_true”进行比较来了解模型当前的表现如何。\n",
    "\n",
    "To make the model better at classifying the input images, we must somehow change the variables for `weights` and `biases`. To do this we first need to know how well the model currently performs by comparing the predicted output of the model `y_pred` to the desired output `y_true`.\n",
    "\n",
    "\n",
    "[交叉熵（cross-entropy）](https://en.wikipedia.org/wiki/Cross_entropy)是用于分类的性能度量。交叉熵是一个连续的函数，它总是正的，如果模型的预测输出与期望的输出完全匹配，则交叉熵等于零。因此，优化的目标是尽量减少交叉熵，即通过改变模型的“权重”和“偏差”来使得交叉熵尽可能地接近于零。\n",
    "\n",
    "The cross-entropy is a performance measure used in classification. The cross-entropy is a continuous function that is always positive and if the predicted output of the model exactly matches the desired output then the cross-entropy equals zero. The goal of optimization is therefore to minimize the cross-entropy so it gets as close to zero as possible by changing the `weights` and `biases` of the model.\n",
    "\n",
    "\n",
    "TensorFlow具有用于计算交叉熵的内置函数。 请注意，它使用`logits`的值，因为它也可以在内部计算softmax。\n",
    "\n",
    "TensorFlow has a built-in function for calculating the cross-entropy. Note that it uses the values of the `logits` because it also calculates the softmax internally."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y_true)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们现在已经计算了每个图像分类的交叉熵，因此我们可以衡量模型在每幅图像上的测试性能。但为了使用交叉熵来指导模型变量的优化，我们需要一个标量值，所以我们简单地取所有图像分类的交叉熵的平均值。\n",
    "\n",
    "We have now calculated the cross-entropy for each of the image classifications so we have a measure of how well the model performs on each image individually. But in order to use the cross-entropy to guide the optimization of the model's variables we need a single scalar value, so we simply take the average of the cross-entropy for all the image classifications."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "cost = tf.reduce_mean(cross_entropy)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 优化方法（Optimization method）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现在我们有一个必须要最小化的代价度量（交叉熵），然后我们可以创建一个优化器（optimizer）。在这种情况下，我们采用 [tf的梯度下降优化器](https://www.tensorflow.org/api_docs/python/tf/train/GradientDescentOptimizer)，其步长设置为0.5。\n",
    "\n",
    "Now that we have a cost measure that must be minimized, we can then create an optimizer. In this case it is the basic form of Gradient Descent where the step-size is set to 0.5.\n",
    "\n",
    "注意：此处不执行优化。事实上，包括上述的操作，其实并没有进行运算，我们只是将待优化的对象添加到TensorFlow图中以便以后执行。\n",
    "\n",
    "Note that optimization is not performed at this point. In fact, nothing is calculated at all, we just add the optimizer-object to the TensorFlow graph for later execution."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.5).minimize(cost)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 衡量指标（Performance measures）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们需要更多的衡量指标来向用户显示进度。\n",
    "\n",
    "无论预测的类别是否等于每个图像的真实类别，这都是布尔值（boolean）的矢量。\n",
    "\n",
    "We need a few more performance measures to display the progress to the user.\n",
    "\n",
    "This is a vector of booleans whether the predicted class equals the true class of each image."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "correct_prediction = tf.equal(y_pred_cls, y_true_cls)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这通过首先将布尔值的矢量类型转换为浮点数来计算分类准确度，以便False变为0，True变为1，然后计算这些数字的平均值。\n",
    "\n",
    "注：使用 [tf.cast](https://www.tensorflow.org/versions/r1.9/api_docs/python/tf/cast) 将数据类型进行变换\n",
    "\n",
    "This calculates the classification accuracy by first type-casting the vector of booleans to floats, so that False becomes 0 and True becomes 1, and then calculating the average of these numbers."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 运行TensorFlow（TensorFlow Run）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 创建TensorFlow会话（Create TensorFlow session）\n",
    "\n",
    "一旦创建好TensorFlow图（graph），我们还需要创建一个用于执行图的TensorFlow会话。\n",
    "\n",
    "Once the TensorFlow graph has been created, we have to create a TensorFlow session which is used to execute the graph."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "session = tf.Session()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 初始化变量（Initialize variables）\n",
    "\n",
    "变量 `weights` 和 `biases`必须在开始优化前进行初始化。\n",
    "\n",
    "注：一般采用 [tf.global_variables_initializer()](https://www.tensorflow.org/api_docs/python/tf/global_variables_initializer)对所有变量进行初始化。\n",
    "\n",
    "The variables for `weights` and `biases` must be initialized before we start optimizing them."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "session.run(tf.global_variables_initializer())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 执行迭代优化的帮助函数（Helper-function to perform optimization iterations）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "训练集含有50,000 幅图像。使用所有这些图像来计算模型的梯度耗时较久。因此，我们使用随机梯度下降法（Stochastic Gradient Descent，SGD），它只在优化器的每次迭代中使用一小批（small batch）图像。\n",
    "\n",
    "There are 50.000 images in the training-set. It takes a long time to calculate the gradient of the model using all these images. We therefore use Stochastic Gradient Descent which only uses a small batch of images in each iteration of the optimizer."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "batch_size = 100"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "用于执行若干次优化迭代的函数，以逐渐改善模型的“权重”和“偏差”。 在每次迭代中，从训练集中选择一批新的数据，然后TensorFlow使用这些训练样本执行优化器。\n",
    "\n",
    "Function for performing a number of optimization iterations so as to gradually improve the `weights` and `biases` of the model. In each iteration, a new batch of data is selected from the training-set and then TensorFlow executes the optimizer using those training samples."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def optimize(num_iterations):\n",
    "    '''优化器'''\n",
    "    for i in range(num_iterations):\n",
    "        # 获取一小批训练样本\n",
    "        # x_batch 存储一小批训练样本，y_true_batch是这些训练样本（图像）的真实标签\n",
    "        x_batch, y_true_batch = data.train.next_batch(batch_size)\n",
    "        \n",
    "        # 将批处理(batch)放入合适命名的字典中，该字典中的键（key）是TensorFlow图中的占位符变量（x、y_true和y_true_cls）。\n",
    "        # 注意：占位符y_true_cls并不是集合（set），因为在训练时候，其没有被使用\n",
    "        feed_dict_train = {x: x_batch, y_true: y_true_batch}\n",
    "        \n",
    "        # 使用小批量的训练数据来运行优化器\n",
    "        # 在feed_dict_train中，TensorFlow将变量赋值给占位符变量，然后运行优化器\n",
    "        session.run(optimizer, feed_dict = feed_dict_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 显示的帮助函数（Helper-functions to show performance）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "使用测试集数据（10,000幅图像）进行Dict，以用作TensorFlow图的输入。请注意，我们必须在TensorFlow图中使用占位符变量的正确名称。\n",
    "\n",
    "Dict with the test-set data to be used as input to the TensorFlow graph. Note that we must use the correct names for the placeholder variables in the TensorFlow graph."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "feed_dict_test = {x: data.test.images, y_true: data.test.labels, y_true_cls: data.test.cls}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "输出测试集上分类准确率的函数\n",
    "\n",
    "Function for printing the classification accuracy on the test-set."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def print_accuracy():\n",
    "    '''计算并输出准确率'''\n",
    "    acc = session.run(accuracy, feed_dict=feed_dict_test)\n",
    "    \n",
    "    # 打印准确率\n",
    "    print(\"Accuray on test-set: {0:.1%}\".format(acc))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "使用scikit-learn 输出并绘制 误差（confusion）矩阵的函数\n",
    "\n",
    "Function for printing and plotting the confusion matrix using scikit-learn."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def print_confusion_matrix():\n",
    "    '''输出误差（confusion）矩阵'''\n",
    "    # 获得测试集的真实分类标签\n",
    "    cls_true = data.test.cls\n",
    "    \n",
    "    # 计算测试集的预测分类结果\n",
    "    cls_pred = session.run(y_pred_cls, feed_dict=feed_dict_test)\n",
    "\n",
    "    # 使用sklearn计算误差矩阵，confusion_matrix是sklearn的API函数\n",
    "    cm = confusion_matrix(y_true=cls_true,\n",
    "                          y_pred=cls_pred)\n",
    "\n",
    "    # 以文本的形式输出误差矩阵\n",
    "    print(cm)\n",
    "\n",
    "    # 以图像的形式绘制误差矩阵\n",
    "    plt.imshow(cm, interpolation='nearest', cmap=plt.cm.Blues)\n",
    "\n",
    "    # 为绘图做不同的调整\n",
    "    plt.tight_layout()\n",
    "    plt.colorbar()\n",
    "    tick_marks = np.arange(num_classes)\n",
    "    plt.xticks(tick_marks, range(num_classes))\n",
    "    plt.yticks(tick_marks, range(num_classes))\n",
    "    plt.xlabel('Predicted')\n",
    "    plt.ylabel('True')\n",
    "\n",
    "    # 确保在单个Notebook网格中显示多个子图\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "用于绘制来自测试集的图像的错误分类的示例的功能。\n",
    "\n",
    "Function for plotting examples of images from the test-set that have been mis-classified."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def plot_example_errors():\n",
    "    '''绘制分类错误的测试样本'''\n",
    "    # 使用TensorFlow获取布尔值列表，无论每个测试图像是否已正确分类，以及每个图像的预测类列表\n",
    "    # Use TensorFlow to get a list of boolean values\n",
    "    # whether each test-image has been correctly classified,\n",
    "    # and a list for the predicted class of each image.\n",
    "    correct, cls_pred = session.run([correct_prediction, y_pred_cls],\n",
    "                                    feed_dict=feed_dict_test)\n",
    " \n",
    "    # 错误布尔数组\n",
    "    incorrect = (correct == False)\n",
    "    \n",
    "    # 从测试集中获取已被错误分类的图像数据\n",
    "    images = data.test.images[incorrect]\n",
    "    \n",
    "    # 获得这些图像的预测类别\n",
    "    cls_pred = cls_pred[incorrect]\n",
    "\n",
    "    # 获得这些图像的真实类别\n",
    "    cls_true = data.test.cls[incorrect]\n",
    "    \n",
    "    # 绘制前9幅图像（错误分类）\n",
    "    plot_images(images=images[0:9],\n",
    "                cls_true=cls_true[0:9],\n",
    "                cls_pred=cls_pred[0:9])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 绘制模型权重的帮助函数（Helper-function to plot the model weights）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "用于绘制模型权重的函数。绘制10幅图像，每幅图像对应于被模型训练识别的类别。\n",
    "\n",
    "Function for plotting the `weights` of the model. 10 images are plotted, one for each digit that the model is trained to recognize."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def plot_weights():\n",
    "    '''绘制模型权重'''\n",
    "    # 从TensorFlow变量中获得权重的值\n",
    "    w = session.run(weights)\n",
    "    \n",
    "    # 计算权重的最小值和最大值\n",
    "    # 这用于校正图像间的颜色强度，以便它们可以相互比较\n",
    "    w_min = np.min(w)  # 权重的最小值\n",
    "    w_max = np.max(w)  # 权重的最大值\n",
    "\n",
    "    # 创建含 3x4子图的图像，其中最后两个子图无意义。\n",
    "    fig, axes = plt.subplots(3, 4)\n",
    "    fig.subplots_adjust(hspace=0.3, wspace=0.3)\n",
    "\n",
    "    for i, ax in enumerate(axes.flat):\n",
    "        # Only use the weights for the first 10 sub-plots.\n",
    "        if i<10:\n",
    "            # 获得第i幅图像的权重，并改变其形状与图像数据一致\n",
    "            # 注意：w.shape == (img_size_flat, 10)\n",
    "            image = w[:, i].reshape(img_shape)\n",
    "\n",
    "            # 为子图设置标签（lable）\n",
    "            ax.set_xlabel(\"Weights: {0}\".format(i))\n",
    "\n",
    "            # 绘制图像\n",
    "            ax.imshow(image, vmin=w_min, vmax=w_max, cmap='seismic')\n",
    "        # 删除每个子图的刻度\n",
    "        ax.set_xticks([])\n",
    "        ax.set_yticks([])\n",
    "        \n",
    "    # 显示图像\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 优化前的性能（Performance before any optimization）\n",
    "\n",
    "测试集的准确度为9.8％。这是因为该模型只进行了初始化而没有进行优化，因此它总是预测图像显示为零数字（预测类别为零），如下图所示。\n",
    "\n",
    "print_accuray()表示在会话中执行图，即发生了“真正”的运算。\n",
    "\n",
    "The accuracy on the test-set is 9.8%. This is because the model has only been initialized and not optimized at all, so it always predicts that the image shows a zero digit, as demonstrated in the plot below, and it turns out that 9.8% of the images in the test-set happens to be zero digits."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuray on test-set: 9.8%\n"
     ]
    }
   ],
   "source": [
    "# 输出测试集上的准确率\n",
    "print_accuracy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1ea2d48e390>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制错误样本\n",
    "plot_example_errors()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 在第一次迭代优化后的性能（Performance after 1 optimization iteration）\n",
    "\n",
    "经过一次优化迭代后，该模型已将测试集的准确度从9.8％提高到40%~60％。这意味着它在10次中有4~6次对图像进行了错误分类，如下面的几个例子所示。\n",
    "\n",
    "Already after a single optimization iteration, the model has increased its accuracy on the test-set to 40.7% up from 9.8%. This means that it mis-classifies the images about 6 out of 10 times, as demonstrated on a few examples below."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "optimize(num_iterations=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuray on test-set: 52.2%\n"
     ]
    }
   ],
   "source": [
    "print_accuracy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1fb3332d2e8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_example_errors()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "权重也可以绘制如下所示。正面权重是红色，负面权重是蓝色。这些权重可以直观地理解为图像过滤器。\n",
    "\n",
    "例如，用于确定图像是否显示零位的权重对圆形图像具有正面反应（红色），并对具有圆形中心内容的图像具有负面反应（蓝色）。\n",
    "\n",
    "类似地，用于确定图像是否显示一位数字的权重对图像中心的垂直线作出正面（红色）反应，并对包含该线条内容的图像做出负面（蓝色）反应。\n",
    "\n",
    "请注意，权重大多看起来像他们应该被识别出的数字。这是因为只执行了一次优化，所以权重仅在100幅（batch=100）图像上进行训练。在对数千幅图像进行训练之后，权重变得更加难以解释，因为他们必须认识到数字可以写成很多种变化形态。\n",
    "\n",
    "The weights can also be plotted as shown below. Positive weights are red and negative weights are blue. These weights can be intuitively understood as image-filters.\n",
    "\n",
    "For example, the weights used to determine if an image shows a zero-digit have a positive reaction (red) to an image of a circle, and  have a negative reaction (blue) to images with content in the centre of the circle.\n",
    "\n",
    "Similarly, the weights used to determine if an image shows a one-digit react positively (red) to a vertical line in the centre of the image, and react negatively (blue) to images with content surrounding that line.\n",
    "\n",
    "Note that the weights mostly look like the digits they're supposed to recognize. This is because only one optimization iteration has been performed so the weights are only trained on 100 images. After training on several thousand images, the weights become more difficult to interpret because they have to recognize many variations of how digits can be written."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nI/5/Y4WAXPUq/0kAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1ea292490b8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_weights()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 在迭代10次优化后的性能（Performance after 10 optimization iterations）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 我们已经执行过一次迭代\n",
    "optimize(num_iterations=9)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuray on test-set: 80.7%\n"
     ]
    }
   ],
   "source": [
    "print_accuracy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1ea2d39bbe0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_example_errors()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nCAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1ea320a1320>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_weights()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 在迭代1000次优化后的性能（Performance after 1000 optimization iterations）\n",
    "\n",
    "在1000次迭代优化后，模型仅对大约十分之一的图像进行错误分类（即正确率在90%左右）。如下所示，一些误分类是合理的，因为即使对于人类来说，图像也很难确定，而其他图像非常明显，应该通过一个好的模型正确分类。但是这种简单的模型无法达到更好的性能，因此需要更复杂的模型。\n",
    "\n",
    "After 1000 optimization iterations, the model only mis-classifies about one in ten images. As demonstrated below, some of the mis-classifications are justified because the images are very hard to determine with certainty even for humans, while others are quite obvious and should have been classified correctly by a good model. But this simple model cannot reach much better performance and more complex models are therefore needed."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# We have already performed 10 iterations.\n",
    "optimize(num_iterations=990)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuray on test-set: 91.9%\n"
     ]
    }
   ],
   "source": [
    "print_accuracy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAU0AAAD5CAYAAACj3GcTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAAIABJREFUeJzt3Xu8VXP+x/HXp2K6Kd3QpDpIqQnx\nyy3GtYtbFKkwZlwKuTPEMAwjtwwl1xozLiOiUIQSujBCpdIpTBoipKKGcon6/v7Y67vX3nXO2Xud\nfTl7n97Px+M8zt5rf9da33O+e3/3Z33X92LOOUREJD01qjoDIiLFRJWmiEgEqjRFRCJQpSkiEoEq\nTRGRCFRpiohEoEpTRCQCVZoiIhGo0hQRiaBWJjs3bdrUlZSUZCkrxWHOnDmrnHPNqjof+aIyrv5U\nxtFkVGmWlJQwe/bsTA5RdMxsaVXnIZ9UxtWfyjgaXZ6LiESgSlNEJAJVmiIiEajSFBGJQJWmiEgE\nqjRFRCJQpSkiEkFG/TQL0erVqwH49NNPy03TunVrAIYNGwZAx44dAWjbti0Ae+65Zy6zKMCaNWsA\naNCgAQA1auj7u7oZNGgQACNHjgSgX79+APzzn/8EoE6dOlWTsQzpnSoiEkHRR5oTJ04E4Pnnnwdg\n2rRpACxevLjcfdq1awfAJ598AsBPP/2U9PrGjRuznEvZ1EknnQRAvXr1ABgwYAAAxx57bE7Ot2LF\nCgAaN24MQK1aRf/WL1hffvklAJMmTQLAzAB46qmnABg4cCAAhx9+eBXkLnOKNEVEIiiKr9slS5YA\ncO+99wIwatSo+Gs//PADAFGWIv7www+zmDupjL333huAoUOHAnDIIYfk9HzDhw8H4Oeffwbg9ttv\nz+n5tmTNmzcHYIcddgA2v79wyy23ALDPPvvEt22zzTZ5yl3mFGmKiERQFJHmsmXLgDBaqKzddtsN\nCO+WS9Vp2bJlXs4zZcoUAO68804gbL9WpJl7Xbp0AeCdd95J2v7aa68B4X0IgFNOOSV/GcuQIk0R\nkQiqPNJctWpV/LGPJA866CAAjjzySAC23nprABo2bAhA/fr14/usXbsWgB49egBhFLnffvsBsNde\ne8XT+n5h/o6tVJ377rsvL+eZOnUqEEaYvi1Vcs9/Jv29CN+e7CXO4alIU0SkmlKlKSISQZVdnq9b\ntw6Abt26xbfNnz8fgPHjxyelPeCAAwCYO3cuEJue3/PdGXbccUdAw/EKXWlpKQBffPFFXs73yiuv\nJD3/y1/+kpfzCnTv3h0Im8reeOONpNfHjBkTf3zOOecA4cCTQqYaRkQkgrxHmuvXrwfChl8fXQJc\nffXVAHTt2rXMfctaMa9Vq1ZZzqHk0syZMwH43//+l7Q92zfn/I0ff/PB3wQ8+OCDs3oeSe3Pf/4z\nEN7Y9b766qv44z59+gCwYMGC/GWskhRpiohEkLdI03cNuvnmm4GwY2uzZuHSw1dccQUAdevWzVe2\nJA982QPccccdSa/17t0bgLPPPjur55wwYQIA8+bNSzr+tttum9XzSGoHHnggEE6W8s0332yWxl95\nfPvtt0A4ZWAhUqQpIhJB3iJNf0f81ltvBcKJgF9//fV4Gt95XaqXSy+9NP5408lScnU32090K1XP\nXzledtllQNjGmcgPlZ4+fToAPXv2zFPuolOkKSISQd4izTfffDPpuR/e6PtXSvXz3HPPATB27NjN\nXvM9IbLdL8+3jSXemZXC8Mc//hGAF198Edi8TgAYMmQIEE720aRJkzzlLn2KNEVEIshbpDlu3Lik\n5y+99BIAN9xwQ3zbcccdByRPsiHFx98BvfHGG4HN+2QCPPvsswDUrl07q+f++OOPgfCuuXfWWWdl\n9TwSnZ94x/9OnDjcP541axYQLpmhSFNEpMip0hQRiSBvl+crV64EwpXp/DC3xMtz3wh87rnnAuFA\n/88++wyANm3aAPCb3/xms+MvXLgQCCf30A2mquNXfkycL9Hzndl33333vOapEC/ztlS+u6GvCxL5\nbX7wSyGusqBIU0QkgrxFmpdffjmw+TC6RBs2bADCmZ797yi22247AA499FAgefopya3JkycD4cQr\n3q677hp/7Mu0Zs2aQHgDwE8VWJatttoK2Hzmbz/JR1kRi+cj25133jn1HyB50atXLwAeeeSRctP4\n95IfWl1I69Qr0hQRiSBv1bcfPtm3b18ATj31VCA5evBDqXzEWRm+Pc13qE5sEylr+JZkj58k4913\n303a7tuvAW666aak13xZP/DAA+Ue13dB85NQe6NHjwaSh9y9/PLLSWn8BB0VRaOSX0cffTQA7du3\nj29btGhRUho/vNqvG+avVAuBIk0RkQjyFmn6Nqx99tkHgP/85z+bpXn11VeBMPq8/vrrgc3XTU6H\n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\nSUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1ea2f8d2ba8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_example_errors()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "该模型现已经过1000次迭代优化的训练，每次迭代使用来自训练集的100幅图像。由于图像种类繁多，权重现在变得难以解释，我们可能会怀疑模型是否真正了解数字是如何由线条组成的，或者模型是否只记住了许多不同的像素变体。\n",
    "\n",
    "注：迭代越多次，可视化的权重变得越难以解释。\n",
    "\n",
    "The model has now been trained for 1000 optimization iterations, with each iteration using 100 images from the training-set. Because of the great variety of the images, the weights have now become difficult to interpret and we may doubt whether the model truly understands how digits are composed from lines, or whether the model has just memorized many different variations of pixels."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1ea393aedd8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_weights()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们还可以打印和绘制所谓的误差矩阵（confusion matrix），让我们可以看到有关错误分类的更多细节。例如，它显示实际描述 5的图像有时被错误分类为所有其它可能的数字，但大多数是3, 6或 8。\n",
    "\n",
    "We can also print and plot the so-called confusion matrix which lets us see more details about the mis-classifications. For example, it shows that images actually depicting a 5 have sometimes been mis-classified as all other possible digits, but mostly either 3, 6 or 8."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 958    0    2    2    0    3   11    2    2    0]\n",
      " [   0 1107    2    3    0    1    4    2   16    0]\n",
      " [   9    7  911   22   10    1   14   11   42    5]\n",
      " [   3    0   13  936    0   16    5   10   20    7]\n",
      " [   1    1    4    1  912    0   16    2   10   35]\n",
      " [  10    4    5   55   10  731   26    7   37    7]\n",
      " [  10    3    3    2    8    7  922    1    2    0]\n",
      " [   3   10   23    9   10    1    0  937    3   32]\n",
      " [   9    8    6   26    8   20   14    9  872    2]\n",
      " [  12    7    3   10   36    6    0   25    9  901]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1ea395e97b8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print_confusion_matrix()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上图分别显示了误差矩阵的文本形式和图像形式。其中文本形式可以看到误分类的具体情况，如真实为5的图像被预测为5的情况最多（预测正确），大概在700+\n",
    "，其次被预测为3和8的情况也比较多。而图像可视化，可以较为直观地看出当前模型的分类准确情况。深蓝色表示多数图像被预测的结果分布，由上图可知：\n",
    "预测结果和真实情况出入不大，模型的正确率还可以。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "最后，我们通过关闭会话（Session）来释放内存资源。\n",
    "\n",
    "We are now done using TensorFlow, so we close the session to release its resources."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# This has been commented out in case you want to modify and experiment\n",
    "# with the Notebook without having to restart it.\n",
    "session.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 练习（Exercises）\n",
    "\n",
    "下面是一些可能有助于提高TensorFlow技能的练习建议。获得TensorFlow的实践经验对于学习如何正确使用它非常重要。\n",
    "\n",
    "These are a few suggestions for exercises that may help improve your skills with TensorFlow. It is important to get hands-on experience with TensorFlow in order to learn how to use it properly.\n",
    "\n",
    "进行任何更改之前，您可能需要备份此文件。\n",
    "\n",
    "- 更改优化器的学习率（learning rate）。\n",
    "- 将优化器更改为 AdagradOptimizer或 AdamOptimizer。\n",
    "- 将批量大小更改为 1或 1000。\n",
    "- 思考上述这些变化如何影响性能？\n",
    "- 您是否认为这些变化对其他分类问题和数学模型具有相同的影响（如果有的话）？\n",
    "- 如果多次运行本文件，而不更改任何参数，您会得到完全相同的结果吗？ 为什么或者为什么不？\n",
    "- 更改函数plot_example_errors()，以便它还打印错误分类示例的logits和y_pred值。\n",
    "- 使用sparse_softmax_cross_entropy_with_logits而不是softmax_cross_entropy_with_logits。 这可能需要对源代码中的多个位置进行多处更改。 讨论使用这两种方法的优缺点。\n",
    "- 自己重新编写程序，而不必过多考虑此源代码。\n",
    "- 向朋友解释程序是如何工作的。\n",
    "\n",
    "You may want to backup this Notebook before making any changes.\n",
    "\n",
    "* Change the learning-rate for the optimizer.\n",
    "* Change the optimizer to e.g. `AdagradOptimizer` or `AdamOptimizer`.\n",
    "* Change the batch-size to e.g. 1 or 1000.\n",
    "* How do these changes affect the performance?\n",
    "* Do you think these changes will have the same effect (if any) on other classification problems and mathematical models?\n",
    "* Do you get the exact same results if you run the Notebook multiple times without changing any parameters? Why or why not?\n",
    "* Change the function `plot_example_errors()` so it also prints the `logits` and `y_pred` values for the mis-classified examples.\n",
    "* Use `sparse_softmax_cross_entropy_with_logits` instead of `softmax_cross_entropy_with_logits`. This may require several changes to multiple places in the source-code. Discuss the advantages and disadvantages of using the two methods.\n",
    "* Remake the program yourself without looking too much at this source-code.\n",
    "* Explain to a friend how the program works."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## License (MIT)\n",
    "\n",
    "Copyright (c) 2016 by [Magnus Erik Hvass Pedersen](http://www.hvass-labs.org/)\n",
    "\n",
    "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n",
    "\n",
    "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n",
    "\n",
    "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.4"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
